package fnsvr

import (
	"errors"
	"math"
)

//按位存储数据操作

// 超界
var ErrBitValueOutOfBounds = errors.New("bitvalue: out of bounds")

// 设置值
func SetBitValue(evtId int, evtValue []int64) error {
	idx := GetBitValueIdx(evtId)
	if idx < 0 || idx >= len(evtValue) {
		return ErrBitValueOutOfBounds
	}

	pos := getBitValuePos(evtId)
	evtValue[idx] |= (1 << pos)
	return nil
}

// 获取值
func GetBitValue(evtId int, evtValue []int64) bool {
	if evtId <= 0 {
		return false
	}
	idx := GetBitValueIdx(evtId)
	if idx < 0 || idx >= len(evtValue) {
		return false
	}
	pos := getBitValuePos(evtId)
	return (evtValue[idx] & (1 << pos)) != 0
}

func GetBitValueIdx(evtId int) int { return int(math.Floor(float64(evtId) / 32)) }

func getBitValuePos(evtId int) uint { return uint(evtId % 32) }
